/* Alloy Analyzer 4 -- Copyright (c) 2006-2009, Felix Chang
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
 * (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
 * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

package edu.mit.csail.sdg.alloy4graph;

import javax.swing.Icon;
import edu.mit.csail.sdg.alloy4.OurUtil;

/** Immutable; this defines the set of possible node shapes (BOX, CIRCLE, ELLIPSE...)
 *
 * <p><b>Thread Safety:</b> Can be called only by the AWT event thread.
 */

public enum DotShape {

   /** Ellipse            */ ELLIPSE("Ellipse", "ellipse"),
   /** Box                */ BOX("Box", "box"),
   /** Circle             */ CIRCLE("Circle", "circle"),
   /** Egg                */ EGG("Egg", "egg"),
   /** Triangle           */ TRIANGLE("Triangle", "triangle"),
   /** Diamond            */ DIAMOND("Diamond", "diamond"),
   /** Trapezoid          */ TRAPEZOID("Trapezoid", "trapezium"),
   /** Parallelogram      */ PARALLELOGRAM("Parallelogram", "parallelogram"),
   /** House              */ HOUSE("House", "house"),
   /** Hexagon            */ HEXAGON("Hexagon", "hexagon"),
   /** Octagon            */ OCTAGON("Octagon", "octagon"),
   /** Double Circle      */ DOUBLE_CIRCLE("Dbl Circle", "doublecircle"),
   /** Double Octagon     */ DOUBLE_OCTAGON("Dbl Octagon", "doubleoctagon"),
   /** Triple Octagon     */ TRIPLE_OCTAGON("Tpl Octagon", "tripleoctagon"),
   /** Inverted Triangle  */ INV_TRIANGLE("Inv Triangle", "invtriangle"),
   /** Inverted House     */ INV_HOUSE("Inv House", "invhouse"),
   /** Inverted Trapezoid */ INV_TRAPEZOID("Inv Trapezoid", "invtrapezium"),
   /** Lined Diamond      */ M_DIAMOND("Lined Diamond", "Mdiamond"),
   /** Lined Square       */ M_SQUARE("Lined Square", "Msquare"),
   /** Lined Circle       */ M_CIRCLE("Lined Circle", "Mcircle");

   /** The description of this line style. */
   private final String name;

   /** The icon for this line style. */
   private final Icon icon;

   /** The corresponding DOT attribute. */
   private final String dotName;

   /** Constructs a DotShape object. */
   private DotShape(String name, String dotName) {
      this.name = name;
      this.icon = OurUtil.loadIcon("icons/ShapeIcons/" + dotName + ".gif");
      this.dotName = dotName;
   }

   /** Returns the String that will be displayed in the GUI to represent this value. */
   public String getDisplayedText() { return name; }

   /** Returns the String that should be written into the dot file for this value, when used with the given palette. */
   public String getDotText() { return dotName; }

   /** Returns the Icon that will be displayed in the GUI to represent this value, when used with the given palette. */
   public Icon getIcon() { return icon; }

   /** This method is used in parsing the XML value into a valid Shape; returns null if there is no match. */
   public static DotShape parse(String x) {
      if (x != null) for(DotShape d: values()) if (d.name.equals(x)) return d;
      return null;
   }

   /** This value is used in writing XML. */
   @Override public String toString() { return name; }
}
